/*
 * ProcesadorInfo.cpp
 *
 *
 *  Created on: 16/05/2011
 *      Author: Jonathan
 */

#include "ProcesadorInfo.h"
#include <stdlib.h>
#include "managers/FileManager.h"
#include <iostream>
ProcesadorInfo * ProcesadorInfo::procesadorInfoInstance = NULL;

/*************************************************************
 * 															 *
 * 						PUBLIC								 *
 * 															 *
 *************************************************************/

ProcesadorInfo::~ProcesadorInfo(){
delete this->stopWords;
}
ProcesadorInfo::ProcesadorInfo(){
	LectorArchivos archivoAux;
	string palabraAux;
	this->datosYaProcesados = false;
	this->stopWords = new StorePalabras("stops");
	//archivoAux.abrir("C:/Users/Jonathan/Desktop/Algoritmos 2/archivos/stopwords.txt"); //TODO: HAY Q VER DONDE VA A ESTAR EL ARCHIVO FISICAMENTE.
	while (FileManager::getInstance()->getArchivo(STOPWORDS).getLinea(palabraAux)){
		stopWords->insert(palabraAux);
	}
	FileManager::getInstance()->getArchivo(STOPWORDS).irAlPrincipio();

}

/**
 * Devuelve una instancia del procesador asociado a un objeto info
 * @param info la informacion a procesar
 * @return el singleton
 */
ProcesadorInfo *ProcesadorInfo::getInstance(Info & info) {
	if (procesadorInfoInstance == NULL) {
		ProcesadorInfo::procesadorInfoInstance = new ProcesadorInfo();
		atexit(&destroy);

	}
	ProcesadorInfo::procesadorInfoInstance->palabrasActuales.clear();
	ProcesadorInfo::procesadorInfoInstance->stopWordsActuales.clear();
	ProcesadorInfo::procesadorInfoInstance->datosYaProcesados = false;
	ProcesadorInfo::procesadorInfoInstance->informacionLinea = info;
	return ProcesadorInfo::procesadorInfoInstance;
}

/**
 * Procesa la palabras para diferenciar stopwords, etc
 * y pone a datosYaprocesados en true
 */
void ProcesadorInfo::procesarDatos() {
	string palabraAux;
	IteradorLista<string> itinformacionLinea = this->informacionLinea.getPalabras().iterador();
		while (itinformacionLinea.tieneSiguiente()){
			palabraAux = itinformacionLinea.siguiente();
	          if(this->stopWords->getOcurrencias(palabraAux) > 0){
				this->stopWordsActuales.add(palabraAux);
	          }
	          else {
	        	  this->palabrasActuales.add(palabraAux);
	          }
		}
	this->datosYaProcesados = true;
}
/**
 * Devuelve solo las palabras sin stopwords
 * @return una lista de palabras
 */
Lista<string> & ProcesadorInfo::getSoloPalabras() {
	if(!this->datosYaProcesados) {
		this->procesarDatos();
	}
	return this->palabrasActuales;
}
/**
 * Devuelve una lista solo con las stopwords
 * @return una lista de stopwords
 */
Lista<string> & ProcesadorInfo::getStopWords() {
	if(!this->datosYaProcesados) {
		this->procesarDatos();
	}
	return this->stopWordsActuales;
}

/*************************************************************
 * 															 *
 * 						PROTECTED							 *
 * 															 *
 *************************************************************/


/*************************************************************
 * 															 *
 * 						PRIVATE								 *
 * 															 *
 *************************************************************/
/**
 * Destruye la instancia creada al salir.
 */
void ProcesadorInfo::destroy() {
	if(procesadorInfoInstance){ delete procesadorInfoInstance;};
}


